//高阶函数和柯里化---可以让我们创建更加抽象，灵活的函数
function higherOrderFunction(func) {
    return function (num) {
        return func(num);
    }
}
function double(num) {
    return num * 2;
}
const doubleFunc = higherOrderFunction(double);
console.log(doubleFunc(10));


//柯里化
function curry(func) {
    return function curried(...args) {
        if (args.length >= func.length) {
            return func.apply(this, args);
        } else {
            return function (...args2) {
                return curried.apply(this, [...args,...args2]);
            }
        }
    }
}
function sum(a, b, c) {
    return a + b + c;
}
const curriedSum = curry(sum);
console.log(curriedSum(1)(2)(3));


//闭包
function clocure(){
    let i=0;
    return function(){
        return ++i;
    };
}
const func=clocure();
console.log(func());//1
console.log(func());//2

// 作用域
let a=10;
function foo(){
    let a=20;
    console.log(a);
}
foo();
console.log(a);


// 函数式编程中常见模式
//map---相当于遍历
const arr=[1,2,3];
const mapArr=arr.map((item)=>item*2);
console.log(mapArr);

//filter---相当于过滤
const filterArr=arr.filter((item)=>item>1);
console.log(filterArr);

//reduce
const reduceArr=arr.reduce((sum,cur)=>sum+cur,0);   //第一个参数为上一次的结果，第二个参数为当前获取对象
console.log(reduceArr);
